#ifndef _ASYNCLOGGING_H
#define _ASYNCLOGGING_H
#include "AppendFile.h"
#include "CountDownLatch.h"
#include "FixedBuffer.h"
#include "mutex.h"
#include "thread.h"
#include <condition_variable>
#include <memory>
#include <mutex>
#include <stdio.h>
#include <string>

using namespace monsoon;
namespace droneswarm
{
    class AsyncLogging
    {
    public:
        explicit AsyncLogging( const std::string basename, int flushInterval = 2 );
        ~AsyncLogging();
        //该方法用来将日志写入到缓冲区，并且将写满的缓冲区写入到缓冲区容器中。
        void append( const char *logline, int len );
        void start()
        {
            running_ = true;
            thread_.start();
            //使用条件变量阻塞在这里,等待线程执行线程函数时唤醒
            latch_.wait();
        }
        void stop()
        {
            running_ = false;
            cond_.notify_all();
            thread_.join();
        }

    private:
        //线程执行的函数，线程执行的函数是从缓冲区容器中取出缓冲区，将缓冲区中的数据写入到文件中。
        void threadFunc();
        //定义一个线程
        Thread thread_;
        //定义一个互斥锁
        std::mutex mutex_;
        //定义一个条件变量
        std::condition_variable cond_;
        //定义一个信号量
        CountDownLatch latch_;
        std::string basename_;
        int flushInterval_;
        //运行的标志位
        bool running_;
        //定义两个缓冲区，当前缓冲区，下一个缓冲区
        std::shared_ptr< FixedBuffer< kLargeBuffer > > currentBuffer_;
        std::shared_ptr< FixedBuffer< kLargeBuffer > > nextBuffer_;
        //定义一个缓冲区容器，如果当前缓冲区写满，将当前缓冲区写入到文件中后，清零放入这个容器中。
        std::vector< std::shared_ptr< FixedBuffer< kLargeBuffer > > > buffers_;
    };
}  // namespace droneswarm 

#endif